package com.sxj.shop.service.impl;

import com.sxj.shop.dao.ProductDao;
import com.sxj.shop.entity.Item;
import com.sxj.shop.entity.Product;
import com.sxj.shop.exception.RequestParameterErrorException;
import com.sxj.shop.exception.UserNotLoginException;
import com.sxj.shop.factory.ObjectFactory;
import com.sxj.shop.service.CartService;
import com.sxj.shop.util.ParameterUtil;
import com.sxj.shop.vo.Cart;

import java.util.List;

public class CartServiceImpl implements CartService {

    private ProductDao productDao = (ProductDao) ObjectFactory.getObject("productDao");

    @Override
    public void addCart(Cart cart, String id) throws UserNotLoginException, RequestParameterErrorException {
        if (cart == null) {
            throw new UserNotLoginException("请先登录");
        }
        if (ParameterUtil.isNull(id)) {
            throw new RequestParameterErrorException("请求参数有误");
        }
        // 由于商品的价钱可能是浮动的,存在打折的情况
        // 因此,在实现加入购物车时,模拟支付时候的流程,重新查询一下最新的商品信息
        // 此处只模拟当前加入购物车的商品,其他暂不管
        Product product = productDao.selectByPrimaryKey(Integer.parseInt(id));

        // 执行加入购物车,此时存在两种场景
        // 1.需要加入购物车的商品在购物车中已经存在了
        // 2.需要加入购物车的商品在购物车中尚未存在
        // 因此,需要判断不同的场景
        // 获取当前购物车中所有商品信息(明细)
        List<Item> items = cart.getItems();
        // 遍历这些明细
        for (Item item : items) {
            // 如果当前明细中的商品的id与需要加入购物车中的商品id相等
            if (item.getProduct().getId().equals(product.getId())) {
                // 说明此时购物车中已经存在该商品
                // 这时候购物车发生哪些变化?
                // 1.明细数量=原来的明细数量+1
                item.setNum(item.getNum() + 1);
                // 原来的明细总价
                Double oldPrice = item.getPrice();
                // 2.明细总价=当前商品单价*明细数量
                item.setPrice(product.getPrice() * item.getNum());
                // 现在的明细总价
                Double newPrice = item.getPrice();
                // 3.购物车总价=原来的购物车总价-原来的明细总价+现在的明细总价
                cart.setPrice(cart.getPrice() - oldPrice + newPrice);
                // 由于加入购物车的操作尤其仅有一个商品
                // 因此,只要进入到该分支,说明已经找到该商品了
                // 分支结束后,也就表示流程结束了,需要退出方法,不再往下执行
                return;
            }
        }

        // 当整个for循环全部执行结束,尚未退出方法,说明在购物车中没有找到与需要加入购物车一致的商品
        // 即:需要加入购物车的商品在购物车中尚未存在
        // 这时候购物车发生哪些变化?
        // 1.购物车中新增了一条明细信息
        Item item = new Item();
        // 明细商品就是当前商品
        item.setProduct(product);
        // 明细数量=1
        item.setNum(1);
        // 明细总价=商品单价*1
        item.setPrice(product.getPrice());
        // 将新增的明细加入到购物车中
        cart.addItem(item);
        // 2.购物车总价=原来的购物车总价+新增的明细总价
        cart.setPrice(cart.getPrice() + item.getPrice());
    }

    @Override
    public void removeCart(Cart cart, String id) throws UserNotLoginException, RequestParameterErrorException {
        if (cart == null) {
            throw new UserNotLoginException("请先登录");
        }
        if (ParameterUtil.isNull(id)) {
            throw new RequestParameterErrorException("请求参数有误");
        }
        // 遍历购物车中所有明细
        List<Item> items = cart.getItems();
        for (int i = 0; i < items.size(); i++) {
            // 取出当前迭代的明细
            Item item = items.get(i);
            // 判断该明细的商品是否是需要移除的商品
            if (item.getProduct().getId().equals(Integer.parseInt(id))) {
                // 如果该商品是需要移除的商品,那么购物车发生哪些变化?
                // 1.购物车总价=原来的购物车总价-需要移除的明细总价
                cart.setPrice(cart.getPrice() - item.getPrice());
                // 2.移除明细集合中指定的明细
                cart.removeItem(item);
            }
        }
    }

    @Override
    public void modifyCart(Cart cart, String id, String num) throws UserNotLoginException, RequestParameterErrorException {
        if (cart == null) {
            throw new UserNotLoginException("请先登录");
        }
        if (ParameterUtil.isNull(id) || ParameterUtil.isNull(num)) {
            throw new RequestParameterErrorException("请求参数有误");
        }
        // 修改时需要考虑商品最新价钱
        Product product = productDao.selectByPrimaryKey(Integer.parseInt(id));

        // 取出购物车中需要修改的明细
        List<Item> items = cart.getItems();
        for (Item item : items) {
            if (item.getProduct().getId().equals(product.getId())) {
                // 购物车发生哪些变化?
                // 1.明细数量=num
                item.setNum(Integer.parseInt(num));
                Double oldPrice = item.getPrice();
                // 2.明细总价=商品单价*明细数量
                item.setPrice(product.getPrice() * item.getNum());
                Double newPrice = item.getPrice();
                // 3.购物车总价=原来的购物车总价-原来的明细总价+现在的明细总价
                cart.setPrice(cart.getPrice() - oldPrice + newPrice);
            }
        }
    }
}
